v TThread nelze pristupovat na Excel pres OLEObject
Otázka od: Slavek
9. 9. 2004 9:57
zdravim vsechny, prosim o radu
potrebuji exportovat velke mnostvi dat do excelu a spustim ho takhle:
var
MSExcel:Variant;
begin
MSExcel := CreateOleObject('Excel.Application');
MSEXCEL.Range['A1:K64'].Select;
....
end;
vse bezi vpohode, ale kdyz ten stejny kod dam do TMyThread.Execute, vyvola
to vyjimku pri prvnim pristupu k MSEXCEL po CreateOleObject:
EOleSysError "Nebyla volana procedura CoInitialize"
pokusil jsem se CoInitialize tedy zavolat ale potom zase vyjimka:
EOleSysError
"Aplikace zavolala rozhrani, ktere bylo zarazeno do jineho
podprocesu."
dik za kazdou pomoc
Slavek Hemala
Odpovedá: Petr Fejfar
9. 9. 2004 10:37
Slavek wrote:
> pokusil jsem se CoInitialize tedy zavolat ale potom zase vyjimka:
> EOleSysError
"Aplikace zavolala rozhrani, ktere bylo zarazeno do
> jineho podprocesu."
Jestli to neni tim, ze ho volas v konstruktor threadu, ktery bezi v kontextu
hlavniho threadu. Mel bys ho dat do metody Execute.
HTH, pf
Odpovedá: Ondrej Kelle
9. 9. 2004 10:56
> zdravim vsechny, prosim o radu
>
> potrebuji exportovat velke mnostvi dat do excelu a
> spustim ho takhle:
> var
> MSExcel:Variant;
> begin
> MSExcel := CreateOleObject('Excel.Application');
> MSEXCEL.Range['A1:K64'].Select;
> ....
> end;
>
> vse bezi vpohode, ale kdyz ten stejny kod dam do
> TMyThread.Execute, vyvola to vyjimku pri prvnim pristupu
> k MSEXCEL po CreateOleObject:
> EOleSysError "Nebyla volana procedura CoInitialize"
>
> pokusil jsem se CoInitialize tedy zavolat ale potom zase vyjimka:
> EOleSysError
"Aplikace zavolala rozhrani, ktere bylo zarazeno
> do jineho podprocesu."
CoInitialize/CoUninitialize musis volat pre kazdy thread, v ktorom chces
pouzivat COM, zvlast. To znamena v tele metody Execute:
procedure TMyThread.Execute;
begin
CoInitializeEx(nil, CoInitFlags);
try
...
finally
CoUninitialize;
end;
end;
HTH
TOndrej
Odpovedá: Ondrej Kelle
9. 9. 2004 10:37
> CoInitializeEx(nil, CoInitFlags);
Este ma napadlo, ze CoInitializeEx moze byt nil na Win95 a WinNT 3.51, kde
tato funkcia neexistuje, takze lepsie by to mozno bolo takto:
procedure TMyThread.Execute;
begin
if Assigned(CoInitializeEx) then
CoInitializeEx(nil, CoInitFlags)
else
CoInitialize(nil);
try
...
finally
CoUnitialize;
end;
end;
HTH
TOndrej
Odpovedá: Slavek
9. 9. 2004 12:59
uz mi to jede,
prvne se musi volat CoInitialize(nil) a pak az CreateOLEObject uvnitr
vlakna,
CreateOLEObject jsem pred tim volal mimo vlakno
TMyTThread.Execute;
var
MSExcel:Variant;
begin
CoInitialize(nil);
try
MSExcel := CreateOleObject('Excel.Application');
.....
finally
CoUninitialize;
end;
end;
----- Original Message -----
From: "Ondrej Kelle" <o.kelle@digitalpublishing.de>
To: <delphi-l@clexpert.cz>
Sent: Thursday, September 09, 2004 11:31 AM
Subject: Re: v TThread nelze pristupovat na Excel pres OLEObject
> > zdravim vsechny, prosim o radu
> >
> > potrebuji exportovat velke mnostvi dat do excelu a
> > spustim ho takhle:
> > var
> > MSExcel:Variant;
> > begin
> > MSExcel := CreateOleObject('Excel.Application');
> > MSEXCEL.Range['A1:K64'].Select;
> > ....
> > end;
> >
> > vse bezi vpohode, ale kdyz ten stejny kod dam do
> > TMyThread.Execute, vyvola to vyjimku pri prvnim pristupu
> > k MSEXCEL po CreateOleObject:
> > EOleSysError "Nebyla volana procedura CoInitialize"
> >
> > pokusil jsem se CoInitialize tedy zavolat ale potom zase vyjimka:
> > EOleSysError
"Aplikace zavolala rozhrani, ktere bylo zarazeno
> > do jineho podprocesu."
>
> CoInitialize/CoUninitialize musis volat pre kazdy thread, v ktorom chces
> pouzivat COM, zvlast. To znamena v tele metody Execute:
>
> procedure TMyThread.Execute;
> begin
> CoInitializeEx(nil, CoInitFlags);
> try
> ...
> finally
> CoUninitialize;
> end;
> end;
>
> HTH
> TOndrej
>
>
>
>
>